package com.egao.common.module.student.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.egao.common.core.web.JsonResult;
import com.egao.common.core.web.PageParam;
import com.egao.common.module.student.entity.Student;
import com.egao.common.module.student.entity.vo.*;
import com.egao.common.module.system.entity.Dict;
import com.egao.common.module.system.entity.User;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 学生服务接口
 * @author lym
 */
public interface StudentService extends IService<Student> {

    /**
     * 分页查询 管理端
     * @param page StudentListVO
     * @return 集合
     */
    List<StudentListVO> listPage(PageParam<StudentListVO> page);

    /**
     * 根据用户ID获取学生
     * @param userId 用户ID
     * @return 学生对象
     */
    Student getByUserId(Integer userId);

    /**
     * 根据学生学号查询学生
     * @param xh 学生学号
     * @return Student
     */
    Student getByXh(String xh);

    /**
     * 查询学生表单对象
     * @param id 学生主键
     * @return 学生表单对象
     */
    StudentFormVO getStudentFormVO(Integer id);

    /**
     * 延期学生毕业年份到明年
     * @param studentFormVO 学生ID 延期说明
     * @param userId 操作人ID
     * @return JsonResult
     */
    JsonResult delay(StudentFormVO studentFormVO, Integer userId);

    /**
     * 解锁定向生
     * @param studentFormVO 学生ID 解锁说明
     * @param userId 操作人ID
     * @return JsonResult
     */
    JsonResult unlock(StudentFormVO studentFormVO, Integer userId);

    /**
     * 导出学生数据
     * @param page 参数  其中exportType为导出类型 text文字 code代码
     * @param response HttpServletResponse
     * @return response 响应文件
     */
    void exportStudent(PageParam<StudentExcelVO> page, HttpServletResponse response);

    /**
     * 学生生源提交 并记录
     * @param studentFormVO 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult studentSubmit(StudentFormVO studentFormVO, Integer loginUserId);

    /**
     * 学院生源提交 并记录
     * @param studentFormVO 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult collegeSubmit(StudentFormVO studentFormVO, Integer loginUserId);

    /**
     * 校生源提交 并记录
     * @param studentFormVO 表单对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult schoolSubmit(StudentFormVO studentFormVO, Integer loginUserId);

    /**
     * 查询学生就业意向 根据用户ID
     * @param userId 用户ID
     * @return 学生就业意向
     */
    StudentIntenVO getStudentInten(Integer userId);

    /**
     * 更新学生就业意向 并记录
     * @param studentIntenVO 学生就业意向对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult updateStudentInten(StudentIntenVO studentIntenVO, Integer loginUserId);

    /**
     * 更新学生就业方式
     * @param signCategory 就业方式
     * @param studentId 学生ID
     * @return true成功 false失败
     */
    boolean updateSignCategory(String signCategory, Integer studentId);

    /**
     * 学生解约次数+1
     * @param studentId 学生ID
     */
    void termination(Integer studentId);

    /**
     * 根据专业代码查询学生
     * @param majors 专业编号集合
     */
    List<Student> getStudentListByMajors(List<String> majors);

    /**
     * 根据学历计算本研学历
     * @param xl 学历
     * @return 本研学历
     */
    String setDegree(String xl);

    /**
     * 查询学生ID姓名学号
     * @param collegeCode 学院编码
     * @return List<StudentTitleVO>
     */
    List<StudentTitleVO> listStudentTitle(String collegeCode);

    /**
     * 查询学生基本信息、附加信息、学院专业信息
     * @param id
     * @return
     */
    StudentFormVO getDetail(Integer id);

    /**
     * 根据能力查询学生
     * @param map 专业编号集合
     */
    List<Student> getStudentListByAbility(Map<String, Object> map);

    /**
     * 查询就业状态分页列表
     * @param page
     * @return
     */
    List<StudentSignStatusVO> listSignStatusPage(PageParam<StudentSignStatusVO> page);

    /**
     * 更新就业状态
     * @param id 学生主键
     * @param status 就业状态类型 0系统更新 1手动更新
     * @param label 就业状态
     * @param content 就业状态备注
     */
    void updateStatus(Integer id, String status, String label, String content);

    /**
     * 更新就业状态
     * @param studentSignStatusVO
     * @param loginUserId 操作人
     * @return
     */
    JsonResult updateStatus(StudentSignStatusVO studentSignStatusVO, Integer loginUserId);

    /**
     * 导出就业状态
     * @param list
     * @param response
     */
    void exportStatusExcel(List<StudentSignStatusVO> list, HttpServletResponse response);

    /**
     * 查询简历上需要的字典信息
     * @return map
     */
    Map<String, List<Dict>> dictMap();

    /**
     * 更新学生就业意向 并记录
     * @param studentIntenVO 学生就业意向对象
     * @param loginUserId 登录人ID
     * @return JsonResult
     */
    JsonResult temporaryStudentInten(StudentIntenVO studentIntenVO, Integer loginUserId);

    /**
     * 生源统计
     * @param yearId 毕业年份
     * @return
     */
    JsonResult statisticsStudent(String yearId);

    /**
     * 学号验重
     * @param xh 学号
     * @return code=0不重复 code=1重复
     */
    JsonResult verifyRepeat(String xh);

    /**
     * 改变学生自由自主录入状态
     * @param student 学生
     * @param userId 操作人
     * @param state 状态 0开启 1关闭
     */
    void changeSignEntry(Student student, Integer userId, String state);

    /**
     * 删除生源
     * 实则去掉生源毕业年份 满足该生可以正常使用其他非毕业生功能
     * @param ids 学生id逗号相隔字符串
     * @param loginUserId 操作人
     * @return
     */
    JsonResult deleteStudent(String ids, Integer loginUserId);

    /**
     * 查询学院学生个数
     * @param yearId 毕业年份
     * @param xl 学历
     * @param tks 特困生
     * @return List<StudentSignStatisticsCollegeVO>
     */
    List<StudentSignStatisticsCollegeVO> collegeStudentCount(Integer yearId, String xl, String tks);

    /**
     * 查询专业学生个数
     * @param yearId 毕业年份
     * @param xl 学历
     * @return List<StudentSignStatisticsCollegeVO>
     */
    List<StudentSignStatisticsCollegeVO> majorStudentCount(Integer yearId, String xl);

    /**
     * 查询各民族学生个数
     * 排除汉族
     * @param yearId 毕业年份
     * @param xl 学历
     * @param tks 特困生
     * @return
     */
    List<StudentSignStatisticsCollegeVO> mzStudentCount(Integer yearId, String xl, String tks);

    /**
     * 学生学院人数
     * @param yearId 毕业年份ID
     * @return 学院及学院人数
     */
    List<StudentCollegeVO> studentCollegeList(Integer yearId);

    /**
     * 导出求职意向
     * @param page 查询参数
     * @param response
     */
    void exportJob(PageParam<StudentExcelVO> page, HttpServletResponse response);

    /**
     * 导出意向毕业去向
     * @param page 查询参数
     * @param response
     */
    void exportGone(PageParam<StudentExcelVO> page, HttpServletResponse response);

    /**
     * 更改学生自由解约状态
     * @param id 学生主键ID
     * @param loginId 操作人用户ID
     */
    void updateFreeTermination(Integer id, Integer loginId);
}
